package com.zhiche.lisa.bms.service.quote;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.zhiche.lisa.bms.dao.model.quote.Quote;
import com.zhiche.lisa.bms.pojo.vo.activiti.HistoryTask;
import com.zhiche.lisa.bms.pojo.vo.quote.QuoteAndContractVO;
import com.zhiche.lisa.bms.pojo.vo.quote.QuoteAndDtlVO;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 报价单主表 服务类
 * </p>
 *
 * @author liuanshun
 * @since 2018-10-22
 */
public interface QuoteService extends IService<Quote> {
	/**
	 * 查询报价单分页信息
	 *
	 * @param quotePage 包含分页信息的参数
	 * @return 分页数据
	 */
	Page<Quote> selectQuotePage(Page<Quote> quotePage);


	/**
	 * 查询报价单列表信息
	 *
	 * @param condition sql查询的映射条件
	 * @return 报价单集合
	 */
	List<Quote> selectQuoteList(Map<String, Object> condition);


	/**
	 * 查询报价单列表信息
	 *
	 * @param condition sql查询的映射条件
	 * @return 报价单集合
	 */
	List<Quote> selectQuoteListNoTenant(Map<String, Object> condition);

	/**
	 * 根据合同id查询报价单列表
	 *
	 * @param contractId 合同id号
	 * @return 报价单集合
	 */
	List<Quote> selectQuoteListByContractId(Long contractId);

	/**
	 * 无token根据条件后去报价单
	 *
	 * @param contractId
	 * @return
	 */
	List<Quote> selectQuoteListByContractIdNoTenant(Long contractId);

	/**
	 * 根据id号获取报价单列表和详明信息
	 *
	 * @param id 报价单id
	 * @return 报价单和详明信息
	 */
	QuoteAndDtlVO selectQuoteAndDtl(Long id);

	/**
	 * 根据合同id号获取报价单列表和详明信息
	 *
	 * @param contractId 合同id
	 * @return 报价单和详明信息
	 */
	QuoteAndDtlVO selectQuoteAndDtlByContractId(Long contractId);

	/**
	 * 新增一个报价单
	 *
	 * @param quote 报价单基本信息
	 * @return 修改后的报价单
	 */
	Quote insertOneQuote(Quote quote);

	/**
	 * 新增一个报价单及详明
	 *
	 * @param quoteAndDtlVO 报价单和详明的封装对象
	 * @return 修改后的报价单和详明数据
	 */
	QuoteAndDtlVO insertQuoteAndDtl(QuoteAndDtlVO quoteAndDtlVO);

	/**
	 * 创建临时合同
	 *
	 * @param quoteAndContractVO 包含合同附加信息的吧报价单封装对象
	 * @param token              访问其他项目的访问通行证
	 */
	void createTemporaryContract(QuoteAndContractVO quoteAndContractVO, String token);

	/**
	 * 更新报价单信息
	 *
	 * @param quote 包含报价单id的修改结果
	 * @return 更新后的数据
	 */
	Quote updateOneQuote(Quote quote);

	/**
	 * 更新报价单信息
	 *
	 * @param quote 包含报价单id的修改结果
	 * @return 更新后的数据
	 */
	Quote updateAllColumnOneQuote(Quote quote);

	/**
	 * 更新报价单及详明信息
	 *
	 * @param quoteAndDtlVO 包含报价单id和关联详明信息的封装对象
	 * @return 更新后报价单和详明数据
	 */
	QuoteAndDtlVO updateQuoteAndDtl(QuoteAndDtlVO quoteAndDtlVO);

	/**
	 * 提交审核
	 *
	 * @param id 被修改审核的报价单id
	 * @return 更新后的数据
	 */
	Quote submitExamine(Long id);

	/**
	 * 作废
	 *
	 * @param id 被修改弃审的报价单id
	 * @return 更新后的数据
	 */
	Quote blankOut(Long id);

	/**
	 * 审核
	 *
	 * @param id 指定审核的id
	 * @return 更新后的数据
	 */
	Quote examine(Long id);

	/**
	 * 查询待审核的数据
	 *
	 * @param quotePage
	 * @return
	 * @throws Exception
	 */
	Page<Quote> queryWaitConfirmPage(Page<Quote> quotePage) throws Exception;

	/**
	 * 审核确认
	 *
	 * @param id
	 * @throws Exception
	 */
	void computeQuoteTask(Long id) throws Exception;

	/**
	 * 获取审批历史记录
	 *
	 * @param quoteId
	 * @return
	 * @throws Exception
	 */
	List<HistoryTask> queryHistoryTaskList(Long quoteId) throws Exception;

	/**
	 * 审核不通过
	 *
	 * @param quote
	 * @throws Exception
	 */
	void auditFailQuote(Quote quote) throws Exception;
}
